Модуль:Category
--[[ Этот модуль позволяет получить доступ из Lua к содержимому категорий. Ограничения Модуль в настоящее время получает данные через расширение CategoryTree. По этой причине через запрос к категории может быть получено только 200 первых элементов, соответствующих параметрам запроса. Если таких элементов в категории больше, ошибки не возникнет, но они просто не будут обработаны (контролируйте работу через mw.site.stats.pagesInCategory() или ). Обновление страниц, где задействован данный модуль, с обновлением содержимого категорий не гарантируется. Включите на страницу счётчик элементов в категории, чтобы при добавлении и удалении элементов из неё страница обновлялась (однако изменения ключей сортировки могут при этом всё равно не отслеживаться). Режимы Режимы работы (далее mode) такие же, как у тэга : all Выбрать все элементы. Режим по умолчанию. categories Выбрать только подкатегории. pages Выбрать только страницы. parents Выбрать родительские категории данной категории. Обратите внимание, что в режиме parents счётчики содержимого родительских категорий не обрабатываются. Если передан список пространств имён через пробел (далее namespaces, основное пространство как 0 или -), этот параметр игнорируется. Функции content Выводит список элементов данной категории. Параметры: 1, name Имя категории без префикса. format Формат вывода, применяется при отсутствии параметра t для всех элементов, кроме категорий и файлов. Для правильной работы должен содержать «выключенный» вики-код, т. е. следует вместо использовать , , . Значение по умолчанию см. в коде модуля (оно такое, что результаты формируются в безмаркерный список, похожий на вывод тэга categorytree). Следующие последовательности заменяются: $1 Название пространства имён. $2 Имя страницы без префикса. $3 Количество страниц в категории (если пустая — пустая строка). $4 Строчка, составляемая из количеств подкатегорий, обычных страниц и файлов в категории в соответствии с параметрами fc…. В соответствующих трёх параметрах используются форматы функции string.format(). $5 Номер пространства имён. fccategories Формат счётчика категорий. По умолчанию %i кат.. fcsep Разделитель счётчиков. По умолчанию , . j Разделитель записей. По умолчанию новая строка. namespaces Пространства имён. mode Режим. sort Название шаблона (для пространства имён Шаблон: префикс не нужен), по которому будет осуществляться пересортировка результатов. Шаблон будет вызван для каждого элемента с нижеследующим набором параметров, после чего его вывод будет сопоставлен данному элементу, и элементы будут расставлены по возрастанию данных выводов с точки зрения функции compare модуля string. Элементы, значение шаблона для которых совпадёт с параметром }, будут удалены из выборки. Параметры шаблона: 1 Имя элемента без префикса. 2 Номер пространства имён. 3 Название категории, в которой выполняется операция. 4 Значение параметра sortarg вызова #invoke. all, categories, pages, files Для элементов-подкатегорий — соответствующие счётчики. Перед названием шаблона может использоваться знак >, с которым сортироваться будет по убыванию. Если параметр задать, а название шаблона не указать, сортировка будет осуществляться по имени страницы. Если же данный параметр равен ], то элементы будут выведены в порядке, обратном стандартному для категории. sortarg Дополнительный параметр всем вызовам шаблона sort. sortdel Значение шаблона, вычисленного sort, при котором данный элемент надо исключить из выборки. t Шаблон для форматирования вывода (перекрывает параметры f…). Вызывается с параметрами, аналогичными параметрам sort, но четвёртый параметр берётся из targ. targ Дополнительный параметр всем вызовам шаблона t. supercats Выводит список надкатегорий данной категории. Можно пользоваться как более удобной альтернативой . Параметры: 1, name Имя категории без префикса. format Формат вывода. j Разделитель записей. По умолчанию новая строка. sort Шаблон сортировки. Механизм работы аналогичен применяемому в функции content, но параметров только три — имя надкатегории, имя категории и значение параметра sortarg. sortarg Дополнительный параметр всем вызовам шаблона sort. sortdel Значение шаблона, вычисленного sort, при котором данный элемент надо исключить из выборки. t Шаблон форматирования. Механизм работы аналогичен применяемому в функции content, но параметров только три — имя надкатегории, имя категории и значение параметра targ. targ Дополнительный параметр всем вызовам шаблона t. ]] -- Модуль для работы с категориями. Пока всё через хитрые хаки. local M={} local rcmtab = {all="^(%d+):",categories="(%d+) кат.",pages="(%d+) с.",files="(%d+) ф."}; local function gelement(a,b,c)-- Итератор -- NB! В будущем в список возврата, возможно, войдёт ключ сортировки, -- а в параметры — от какого элемента начинать. local n,m,nss=a,b,c; if type(n) 'table' then n=a.name; m=a.mode or m or 'all'; nss=a.namespaces or nss end local cc = mw.text.unstrip( mw.getCurrentFrame():extensionTag( 'categorytree', n, {mode = m, hideroot='on', hideprefix='always', namespaces = nss, showcount='on'} ) ) local func, static, var = cc:gmatch(']-class%s?=^>-CategoryTreeLabelNs(%d+)^>->%s*(^<>-)%s*()'); return function(st,va) local ns,g,f = func(st,va); local all,cats,pgs,files; if ns '14' then local mpatt = cc:match("^^<>*]*>%((^<>+)%)",f) or ;-- не работает при mode=parents all,cats,pgs,files = mpatt:match(rcmtab.all), mpatt:match(rcmtab.categories), mpatt:match(rcmtab.pages), mpatt:match(rcmtab.files) end return g,tonumber(ns),all,cats,pgs,files end, static, var end M.gelement=gelement function M.content(f) local r = {}; for g,ns,all,cats,pgs,files in gelement(f.args'name' or f.args1, f.args'mode' or 'all', f.args'namespaces') do table.insert(r,{g,ns,all,cats,pgs,files}) end if f.args'sort' then--сортируем по шаблону, } = вырезать элемент if f.args'sort' ']' then --сортировка в обратном порядке local t,c ={}, #r+1; for i,v in ipairs® do tc-i = v end r = t else local cmp,t,e,m,h = require('Module:String')._strcmp,{},nil,f.args'sort':match('^(<>?)%s*(.*)'); if h~= then for k,v in ipairs® do e = f:expandTemplate{ title = h, args = {v1, v2, f.args'name' or f.args1,f.args'sortarg', all=v3, categories=v4, pages=v5, files=v6} }; if e ~= f.args.sortdel then table.insert(t, {v,e}) end end table.sort( t, m '>' and function(a,b) return cmp(b2,a2)<0 end or function(a,b) return cmp(a2,b2)<0 end ) r = {} for k, v in pairs(t) do rk = v1 end else table.sort( r, m '>' and function(a,b) return cmp(b1,a1)<0 end or function(a,b) return cmp(a1,b1)<0 end ) end end end if f.args't' then --передаём в шаблон for k,v in pairs® do rk = f:expandTemplate{ title = f.args't', args = {v1, v2, f.args'name' or f.args1,f.args'targ', all=v3, categories=v4, pages=v5, files=v6 } } end else --форматируем в строку for k,v in pairs® do rk = mw.message.newRawMessage(f.args.format or [ [ : 14|6=:|}} }}$2}} }}] ] ):rawParams(mw.site.namespaces[v2].name,v1,v3 or ,v3 and table.concat{ (v4 and (f.args.fccategories or "%i кат."):format(v4) or (v5 or v6) and (f.args.fcsep or ', ') or ''), (v5 and (f.args.fcpages or "%i с."):format(v5) .. (v6 and (f.args.fcsep or ', ')) or ''), v6 and (f.args.fcfiles or "%i ф."):format(v6) or '' } or '',v2 ):plain() end end return table.concat(r, f.args'j' or '\n') end local function Supercats(n) -- NB! Когда-нибудь может появиться параметр количества local cc, res = mw.text.unstrip( mw.getCurrentFrame():extensionTag( 'categorytree', n, {mode = 'parents',hideroot = 'on'} ) ), {}; for cat in cc:gmatch("]*>%s*(.-)%s*") do table.insert(res,cat) end return res end M.Supercats = Supercats; function M.supercats(f) local r = Supercats(f.args.name or f.args1); if f.args'sort' then--сортируем по шаблону, } = вырезать элемент if f.args'sort' ']' then --сортировка в обратном порядке local t,c ={}, #r+1; for i,v in ipairs® do tc-i = v end r = t else cmp,m,h = require('Module:String')._strcmp,f.args'sort':match('^(<>?)%s*(.*)'); if h~= then local t,e = {} for k,v in ipairs® do e = f:expandTemplate{ title = h, args = {v, f.args'name' or f.args1,f.args'sortarg'} }; if e ~= f.args.sortdel then table.insert(t, {v,e}) end end table.sort( t, m '>' and function(a,b) return cmp(b2, a2)<0 end or function(a,b) return cmp(a2, b2)<0 end ) r = {} for k, v in pairs(t) do rk = v1 end else table.sort( r, m '>' and function(a,b) return cmp(b, a)<0 end or function(a,b) return cmp(a, b)<0 end ) end end end if f.args't' then --передаём в шаблон for k,v in pairs® do rk = f:expandTemplate{ title = f.args't', args = {v, f.args'name' or f.args1, f.args'targ'} } end else --форматируем в строку for k,v in pairs® do rk = mw.message.newRawMessage(f.args'format' or ": $1") :rawParams(v):plain() end end return table.concat(r, f.args'j' or '\n') end return M